{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1)\t文件说明\n",
    "Train.csv：训练数据\n",
    "Test.csv：测试数据\n",
    "\n",
    "2)\t字段说明\n",
    "数据集共26个字段: 其中1-24列为输入特征，25-26列为输出特征。\n",
    "    1. ID - 唯一ID（不能用于预测）\n",
    "    2. Gender - 性别\n",
    "    3. City - 城市\n",
    "    4. Monthly_Income - 月收入（以卢比为单位）\n",
    "    5. DOB - 出生日期\n",
    "    6. Lead_Creation_Date - 潜在（贷款）创建日期\n",
    "    7. Loan_Amount_Applied - 贷款申请请求金额（印度卢比，INR）\n",
    "    8. Loan_Tenure_Applied - 贷款申请期限（单位为年）\n",
    "    9. Existing_EMI -现有贷款的EMI（EMI：电子货币机构许可证） \n",
    "    10. Employer_Name雇主名称\n",
    "    11. Salary_Account - 薪资帐户银行\n",
    "    12. Mobile_Verified - 是否移动验证（Y / N）\n",
    "    13. VAR5 - 连续型变量\n",
    "    14. VAR1-  类别型变量\n",
    "    15. Loan_Amount_Submitted - 提交的贷款金额（在看到资格后修改和选择）\n",
    "    16. Loan_Tenure_Submitted - 提交的贷款期限（单位为年，在看到资格后修改和选择）\n",
    "    17. Interest_Rate - 提交贷款金额的利率\n",
    "    18. Processing_Fee - 提交贷款的处理费（INR）\n",
    "    19. EMI_Loan_Submitted -提交的EMI贷款金额（INR）\n",
    "    20. Filled_Form - 后期报价后是否已填写申请表格\n",
    "    21. Device_Type - 进行申请的设备（浏览器/移动设备）\n",
    "    22. Var2 - 类别型变量\n",
    "    23. Source - 类别型变量\n",
    "    24. Var4 - 类别型变量\n",
    "\n",
    "输出：\n",
    "    25. LoggedIn - 是否login（只用于理解问题的变量，不能用于预测，测试集中没有）\n",
    "    26. Disbursed - 是否发放贷款（目标变量），1为发放贷款（目标客户））"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 729,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    " \n",
    "import pandas as pd \n",
    "import numpy as np\n",
    " \n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import r2_score \n",
    "from sklearn.metrics import log_loss\n",
    " \n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 688,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/peng/anaconda3/lib/python3.7/site-packages/IPython/core/interactiveshell.py:2785: DtypeWarning: Columns (12,14,23) have mixed types. Specify dtype option on import or set low_memory=False.\n",
      "  interactivity=interactivity, compiler=compiler, result=result)\n",
      "/home/peng/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py:6211: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n",
      "of pandas will change to not sort by default.\n",
      "\n",
      "To accept the future behavior, pass 'sort=False'.\n",
      "\n",
      "To retain the current behavior and silence the warning, pass 'sort=True'.\n",
      "\n",
      "  sort=sort)\n"
     ]
    }
   ],
   "source": [
    "train = pd.read_csv(\"Train.csv\")\n",
    "test = pd.read_csv(\"Test.csv\")\n",
    "#将测试数据和训练数据和在一起\n",
    "data = train.append(test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 689,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(124737, 27)"
      ]
     },
     "execution_count": 689,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 690,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20000, 27)"
      ]
     },
     "execution_count": 690,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#因为机器的性能，我们取前两万条数据\n",
    "data = data[:20000]\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 691,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>City</th>\n",
       "      <th>DOB</th>\n",
       "      <th>Device_Type</th>\n",
       "      <th>Disbursed</th>\n",
       "      <th>EMI_Loan_Submitted</th>\n",
       "      <th>Employer_Name</th>\n",
       "      <th>Existing_EMI</th>\n",
       "      <th>Filled_Form</th>\n",
       "      <th>Gender</th>\n",
       "      <th>ID</th>\n",
       "      <th>...</th>\n",
       "      <th>Mobile_Verified</th>\n",
       "      <th>Monthly_Income</th>\n",
       "      <th>Processing_Fee</th>\n",
       "      <th>Salary_Account</th>\n",
       "      <th>Source</th>\n",
       "      <th>Unnamed: 26</th>\n",
       "      <th>Var1</th>\n",
       "      <th>Var2</th>\n",
       "      <th>Var4</th>\n",
       "      <th>Var5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Delhi</td>\n",
       "      <td>23-May-78</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>CYBOSOL</td>\n",
       "      <td>0.0</td>\n",
       "      <td>N</td>\n",
       "      <td>Female</td>\n",
       "      <td>ID000002C20</td>\n",
       "      <td>...</td>\n",
       "      <td>N</td>\n",
       "      <td>20000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>HDFC Bank</td>\n",
       "      <td>S122</td>\n",
       "      <td>NaN</td>\n",
       "      <td>HBXX</td>\n",
       "      <td>G</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Mumbai</td>\n",
       "      <td>07-Oct-85</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6762.9</td>\n",
       "      <td>TATA CONSULTANCY SERVICES LTD (TCS)</td>\n",
       "      <td>0.0</td>\n",
       "      <td>N</td>\n",
       "      <td>Male</td>\n",
       "      <td>ID000004E40</td>\n",
       "      <td>...</td>\n",
       "      <td>Y</td>\n",
       "      <td>35000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>ICICI Bank</td>\n",
       "      <td>S122</td>\n",
       "      <td>NaN</td>\n",
       "      <td>HBXA</td>\n",
       "      <td>G</td>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Panchkula</td>\n",
       "      <td>10-Oct-81</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>ALCHEMIST HOSPITALS LTD</td>\n",
       "      <td>0.0</td>\n",
       "      <td>N</td>\n",
       "      <td>Male</td>\n",
       "      <td>ID000007H20</td>\n",
       "      <td>...</td>\n",
       "      <td>Y</td>\n",
       "      <td>22500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>State Bank of India</td>\n",
       "      <td>S143</td>\n",
       "      <td>NaN</td>\n",
       "      <td>HBXX</td>\n",
       "      <td>B</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Saharsa</td>\n",
       "      <td>30-Nov-87</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>BIHAR GOVERNMENT</td>\n",
       "      <td>0.0</td>\n",
       "      <td>N</td>\n",
       "      <td>Male</td>\n",
       "      <td>ID000008I30</td>\n",
       "      <td>...</td>\n",
       "      <td>Y</td>\n",
       "      <td>35000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>State Bank of India</td>\n",
       "      <td>S143</td>\n",
       "      <td>NaN</td>\n",
       "      <td>HBXX</td>\n",
       "      <td>B</td>\n",
       "      <td>3</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Bengaluru</td>\n",
       "      <td>17-Feb-84</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>GLOBAL EDGE SOFTWARE</td>\n",
       "      <td>25000.0</td>\n",
       "      <td>N</td>\n",
       "      <td>Male</td>\n",
       "      <td>ID000009J40</td>\n",
       "      <td>...</td>\n",
       "      <td>Y</td>\n",
       "      <td>100000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>HDFC Bank</td>\n",
       "      <td>S134</td>\n",
       "      <td>NaN</td>\n",
       "      <td>HBXX</td>\n",
       "      <td>B</td>\n",
       "      <td>3</td>\n",
       "      <td>17</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 27 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        City        DOB  Device_Type  Disbursed  EMI_Loan_Submitted  \\\n",
       "0      Delhi  23-May-78  Web-browser        0.0                 NaN   \n",
       "1     Mumbai  07-Oct-85  Web-browser        0.0              6762.9   \n",
       "2  Panchkula  10-Oct-81  Web-browser        0.0                 NaN   \n",
       "3    Saharsa  30-Nov-87  Web-browser        0.0                 NaN   \n",
       "4  Bengaluru  17-Feb-84  Web-browser        0.0                 NaN   \n",
       "\n",
       "                         Employer_Name  Existing_EMI Filled_Form  Gender  \\\n",
       "0                              CYBOSOL           0.0           N  Female   \n",
       "1  TATA CONSULTANCY SERVICES LTD (TCS)           0.0           N    Male   \n",
       "2              ALCHEMIST HOSPITALS LTD           0.0           N    Male   \n",
       "3                     BIHAR GOVERNMENT           0.0           N    Male   \n",
       "4                 GLOBAL EDGE SOFTWARE       25000.0           N    Male   \n",
       "\n",
       "            ID  ...   Mobile_Verified Monthly_Income  Processing_Fee  \\\n",
       "0  ID000002C20  ...                 N          20000             NaN   \n",
       "1  ID000004E40  ...                 Y          35000             NaN   \n",
       "2  ID000007H20  ...                 Y          22500             NaN   \n",
       "3  ID000008I30  ...                 Y          35000             NaN   \n",
       "4  ID000009J40  ...                 Y         100000             NaN   \n",
       "\n",
       "        Salary_Account  Source  Unnamed: 26  Var1 Var2  Var4  Var5  \n",
       "0            HDFC Bank    S122          NaN  HBXX    G     1     0  \n",
       "1           ICICI Bank    S122          NaN  HBXA    G     3    13  \n",
       "2  State Bank of India    S143          NaN  HBXX    B     1     0  \n",
       "3  State Bank of India    S143          NaN  HBXX    B     3    10  \n",
       "4            HDFC Bank    S134          NaN  HBXX    B     3    17  \n",
       "\n",
       "[5 rows x 27 columns]"
      ]
     },
     "execution_count": 691,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 692,
   "metadata": {},
   "outputs": [],
   "source": [
    "dropClumns =['ID','City','Employer_Name','Unnamed: 26','Salary_Account','Var1','Var2','Var4',\n",
    "            'Var5','Source']\n",
    "data = data.drop(dropClumns,axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 693,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 20000 entries, 0 to 19999\n",
      "Data columns (total 17 columns):\n",
      "DOB                      20000 non-null object\n",
      "Device_Type              20000 non-null object\n",
      "Disbursed                20000 non-null float64\n",
      "EMI_Loan_Submitted       7120 non-null float64\n",
      "Existing_EMI             20000 non-null float64\n",
      "Filled_Form              19997 non-null object\n",
      "Gender                   20000 non-null object\n",
      "Interest_Rate            7123 non-null float64\n",
      "Lead_Creation_Date       20000 non-null object\n",
      "Loan_Amount_Applied      20000 non-null float64\n",
      "Loan_Amount_Submitted    12842 non-null object\n",
      "Loan_Tenure_Applied      20000 non-null float64\n",
      "Loan_Tenure_Submitted    12842 non-null float64\n",
      "LoggedIn                 20000 non-null float64\n",
      "Mobile_Verified          20000 non-null object\n",
      "Monthly_Income           20000 non-null int64\n",
      "Processing_Fee           6947 non-null float64\n",
      "dtypes: float64(9), int64(1), object(7)\n",
      "memory usage: 2.7+ MB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 694,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DOB                          0\n",
       "Device_Type                  0\n",
       "Disbursed                    0\n",
       "EMI_Loan_Submitted       12880\n",
       "Existing_EMI                 0\n",
       "Filled_Form                  3\n",
       "Gender                       0\n",
       "Interest_Rate            12877\n",
       "Lead_Creation_Date           0\n",
       "Loan_Amount_Applied          0\n",
       "Loan_Amount_Submitted     7158\n",
       "Loan_Tenure_Applied          0\n",
       "Loan_Tenure_Submitted     7158\n",
       "LoggedIn                     0\n",
       "Mobile_Verified              0\n",
       "Monthly_Income               0\n",
       "Processing_Fee           13053\n",
       "dtype: int64"
      ]
     },
     "execution_count": 694,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.isnull().sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 特征工程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 695,
   "metadata": {},
   "outputs": [],
   "source": [
    "#因为数据是在同一年内，所以我们只要取月份即可\n",
    "data['Lead_Creation_day'] = pd.to_datetime(data.Lead_Creation_Date,format='%d-%b-%y').dt.day\n",
    "data = data.drop('Lead_Creation_Date',axis=1)\n",
    "\n",
    "#将其中的数据转换成int类型，并删除其中的非法字符\n",
    "dataCopy = data.copy()\n",
    "for i in range(len(dataCopy)):\n",
    "    amount = dataCopy.iloc[i]['Loan_Amount_Submitted']\n",
    "    try:\n",
    "        int(amount)\n",
    "    except ValueError:\n",
    "        data.drop([i],inplace=True)\n",
    "data['Loan_Amount_Submitted'] = data['Loan_Amount_Submitted'].astype(int)\n",
    "\n",
    "#类别型变量标签化\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "labelencoder = LabelEncoder()\n",
    "data['Mobile_Verified'] = labelencoder.fit_transform(data['Mobile_Verified'])\n",
    "data['Device_Type'] = labelencoder.fit_transform(data['Device_Type'])\n",
    "data['Gender'] = labelencoder.fit_transform(data['Gender'])\n",
    "data['Filled_Form'] = labelencoder.fit_transform(data['Filled_Form'])\n",
    "\n",
    "#将出生日期转换为年龄\n",
    "import datetime\n",
    "birth = pd.to_datetime(data['DOB'],format='%d-%b-%y').dt.year\n",
    "current = datetime.datetime.now().year\n",
    "data['age'] = current-birth\n",
    "data = data.drop('DOB',axis=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 696,
   "metadata": {},
   "outputs": [],
   "source": [
    "#缺省值填充，采用平均数\n",
    "from sklearn.preprocessing import Imputer\n",
    "\n",
    "imputer = Imputer(missing_values='NaN', strategy='mean', axis=0)\n",
    "\n",
    "values_data = data['Loan_Tenure_Submitted'].values.reshape(-1, 1)\n",
    "imputer.fit(values_data)\n",
    "data['Loan_Tenure_Submitted'] = imputer.transform(values_data)\n",
    "\n",
    "values_data = data['Loan_Amount_Submitted'].values.reshape(-1, 1)\n",
    "imputer.fit(values_data)\n",
    "data['Loan_Amount_Submitted'] = imputer.transform(values_data)\n",
    "\n",
    "values_data = data['Interest_Rate'].values.reshape(-1, 1)\n",
    "imputer.fit(values_data)\n",
    "data['Interest_Rate'] = imputer.transform(values_data)\n",
    "\n",
    "values_data = data['Processing_Fee'].values.reshape(-1, 1)\n",
    "imputer.fit(values_data)\n",
    "data['Processing_Fee'] = imputer.transform(values_data)\n",
    "\n",
    "values_data = data['EMI_Loan_Submitted'].values.reshape(-1, 1)\n",
    "imputer.fit(values_data)\n",
    "data['EMI_Loan_Submitted'] = imputer.transform(values_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 697,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Device_Type              0\n",
       "Disbursed                0\n",
       "EMI_Loan_Submitted       0\n",
       "Existing_EMI             0\n",
       "Filled_Form              0\n",
       "Gender                   0\n",
       "Interest_Rate            0\n",
       "Loan_Amount_Applied      0\n",
       "Loan_Amount_Submitted    0\n",
       "Loan_Tenure_Applied      0\n",
       "Loan_Tenure_Submitted    0\n",
       "LoggedIn                 0\n",
       "Mobile_Verified          0\n",
       "Monthly_Income           0\n",
       "Processing_Fee           0\n",
       "Lead_Creation_day        0\n",
       "age                      0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 697,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 698,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 12835 entries, 1 to 19998\n",
      "Data columns (total 17 columns):\n",
      "Device_Type              12835 non-null int64\n",
      "Disbursed                12835 non-null float64\n",
      "EMI_Loan_Submitted       12835 non-null float64\n",
      "Existing_EMI             12835 non-null float64\n",
      "Filled_Form              12835 non-null int64\n",
      "Gender                   12835 non-null int64\n",
      "Interest_Rate            12835 non-null float64\n",
      "Loan_Amount_Applied      12835 non-null float64\n",
      "Loan_Amount_Submitted    12835 non-null float64\n",
      "Loan_Tenure_Applied      12835 non-null float64\n",
      "Loan_Tenure_Submitted    12835 non-null float64\n",
      "LoggedIn                 12835 non-null float64\n",
      "Mobile_Verified          12835 non-null int64\n",
      "Monthly_Income           12835 non-null int64\n",
      "Processing_Fee           12835 non-null float64\n",
      "Lead_Creation_day        12835 non-null int64\n",
      "age                      12835 non-null int64\n",
      "dtypes: float64(10), int64(7)\n",
      "memory usage: 1.8 MB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# XGBoost参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 699,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "y_train = data['Disbursed']\n",
    "x_train = data.drop('Disbursed',axis=1)\n",
    "columns = x_train.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 700,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    " \n",
    "# 分别初始化对特征和目标值的标准化器\n",
    "ss_X = StandardScaler()\n",
    "x_train = ss_X.fit_transform(x_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 701,
   "metadata": {},
   "outputs": [],
   "source": [
    "#从结果来看是一个二分类问题\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)\n",
    " \n",
    "n_estimators = 1000 \n",
    "xgb1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=n_estimators, \n",
    "        max_depth=8,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 702,
   "metadata": {},
   "outputs": [],
   "source": [
    "xgtrain = xgb.DMatrix(x_train, label = y_train)\n",
    "xgb1.set_params(num_class = 2)\n",
    "        \n",
    "cvresult = xgb.cv(xgb1.get_xgb_params(), xgtrain, num_boost_round=n_estimators, folds =kfold,\n",
    "             metrics='mlogloss', early_stopping_rounds=10)\n",
    "n_estimators = cvresult.shape[0]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 703,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "XGBoost cv best n_estimators = 68\n"
     ]
    }
   ],
   "source": [
    "print('XGBoost cv best n_estimators = %s' % n_estimators)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 704,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/peng/anaconda3/lib/python3.7/site-packages/sklearn/preprocessing/label.py:151: DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty.\n",
      "  if diff:\n"
     ]
    }
   ],
   "source": [
    " # 采用交叉验证得到的最佳参数n_estimators，训练模型\n",
    "xgb1.set_params(n_estimators = n_estimators)\n",
    "xgb1.fit(x_train, y_train)\n",
    "y_train_pred = xgb1.predict(x_train)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 705,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of cv on train is 0.7205087290363401\n"
     ]
    }
   ],
   "source": [
    "print('The r2 score of cv on train is',r2_score(y_train, y_train_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 706,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    " \n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "        \n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# GridSearchCV 参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 707,
   "metadata": {},
   "outputs": [],
   "source": [
    "max_depth = range(1,10,2)\n",
    "min_child_weight = range(1,10,2)\n",
    "param_test2_2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "\n",
    "xgb2_2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=68, \n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 708,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n",
       "       colsample_bytree=0.8, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
       "       max_depth=5, min_child_weight=1, missing=None, n_estimators=68,\n",
       "       n_jobs=1, nthread=None, num_class=2, objective='multi:softprob',\n",
       "       random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1,\n",
       "       seed=3, silent=True, subsample=0.3),\n",
       "       fit_params=None, iid=True, n_jobs=-1,\n",
       "       param_grid={'max_depth': range(1, 10, 2), 'min_child_weight': range(1, 10, 2)},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 708,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_2.set_params(num_class = 2)\n",
    "gsearch2_2 = GridSearchCV(xgb2_2, param_grid = param_test2_2, scoring='neg_log_loss',n_jobs=-1, cv=5)\n",
    "gsearch2_2.fit(x_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 709,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.038975 using {'max_depth': 3, 'min_child_weight': 9}\n"
     ]
    }
   ],
   "source": [
    "print(\"Best: %f using %s\" % (gsearch2_2.best_score_, gsearch2_2.best_params_))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 710,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/peng/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/peng/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'- Log Loss')"
      ]
     },
     "execution_count": 710,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAELCAYAAADz6wBxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3Xl8VNX9//HXmSUz2feQhJCwZgESwr7JIpu4oFBB0K/W1n3/1X7t16W2Yq2ttlatbd2tW6u4W7WsARTEBQHDnrAnhATIvk8yy/n9MZNhMlkJmcyEnOfjkUdm5p578xmM8865595zhJQSRVEURekqjbcLUBRFUXo3FSSKoijKOVFBoiiKopwTFSSKoijKOVFBoiiKopwTFSSKoijKOVFBoiiKopwTFSSKoijKOVFBoiiKopwTnbcL6AlRUVFy4MCB3i5DURSl19i+fXuJlDK6M237RJAMHDiQbdu2ebsMRVGUXkMIkdfZturUlqIoinJOVJAoiqIo50QFiaIoinJO+sQYiaL0NmazmYKCAkwmk7dLUc5zRqORhIQE9Hp9l4+hgkRRfFBBQQHBwcEMHDgQIYS3y1HOU1JKSktLKSgoYNCgQV0+jjq1pSg+yGQyERkZqUJE8SghBJGRkefc81VBoig+SoWI0hO64/dMBUk79m0ppOJUnbfLUBRF8WkqSNpgqjHz7SeHWfnCLhrrLd4uR1EUxWepIGmDMUjPRTePpOJ0PVlv7EPapLdLUpQeU1FRwfPPP9+lfZ999lnq6s69J79t2zbuueeecz5Ok5/97Gd8+OGHLV4vLCxk8eLFAHz55Zdcdtllre4/cOBASkpKuq2eJjfddBP79u1rt01btR87dox33nmnzf1uuOEGYmJiGDly5DnX2R4VJO1ISAln6uKhHN1Zwg8rj3m7HEXpMb4QJOPGjeO555475+N0JD4+vtUP6Z7y6quvMnz48C7t21GQ/OxnP2P16tVdLa3T1OW/Hci4MIGS/Gp++OIoUQlBDM7s1BxmitJtHv18L/sKq7r1mMPjQ3hkwYg2tz/wwAMcPnyYzMxM5s6dS0xMDO+//z4NDQ0sWrSIRx99lNraWq666ioKCgqwWq385je/4dSpUxQWFnLhhRcSFRXFxo0bWz1+UFAQd955J1lZWYSHh/OHP/yB//u//yM/P59nn32Wyy+/nC+//JKnnnqKL774guXLl5Ofn8+RI0fIz8/nF7/4Rbu9lbfeeounnnoKIQQZGRm8/fbbAGzatImnn36akydP8qc//YnFixdz7NgxLrvsMvbs2dPsGKWlpVx99dUUFxczYcIEpGz7rMSf/vQnjEYj99xzD/feey87d+5kw4YNrF+/ntdff51//etfrF27lkceeYSGhgaGDBnC66+/TlBQEDNnzuSpp55i3LhxvPbaazz55JPEx8czbNgwDAYDf//739us/YEHHmD//v1kZmZy/fXXc++99zara/r06Rw7dqzNuruL6pF0QAjBjP9JISYpmKzX91FWWOvtkhTF45544gmGDBlCdnY2c+fO5eDBg2zdupXs7Gy2b9/Opk2bWL16NfHx8ezcuZM9e/Ywf/587rnnHuLj49m4cWObIQJQW1vLzJkz2b59O8HBwTz88MOsW7eOTz75hN/+9ret7pOTk8OaNWvYunUrjz76KGazudV2e/fu5fHHH2fDhg3s3LmTv/71r85tRUVFfP3113zxxRc88MAD7f4bPProo1xwwQX8+OOPXH755eTn57fZdvr06WzevBmwn5KrqanBbDbz9ddfM23aNEpKSvj9739PVlYWO3bsYNy4cTz99NPNjlFYWMhjjz3Gd999x7p168jJyWm2vbXan3jiCaZNm0Z2djb33nsvhYWFXHLJJe2+L09QPZJO0Om1XHxbOu//cRsrX9jFkgfHYQjo+l2ginI22us59IS1a9eydu1aRo8eDUBNTQ0HDx5k2rRp3Hfffdx///1cdtllTJs2rdPH9PPzY/78+QCkp6djMBjQ6/Wkp6e3+Rf0pZdeisFgwGAwEBMTw6lTp0hISGjRbsOGDSxevJioqCgAIiIinNsWLlyIRqNh+PDhnDp1qt0aN23axMcff+z82eHh4W22HTt2LNu3b6e6uhqDwcCYMWPYtm0bmzdv5rnnnuO7775j3759TJ06FYDGxkYmT57c7Bhbt25lxowZznqXLFnCgQMHzqr2+Ph4Vq5c2e778gSP9kiEEPOFELlCiENCiBbxL4QwCCHec2z/Xggx0G17ohCiRghxn+O5UQixVQixUwixVwjxqCfrdxUUbuTiW0ZSXWZi7Wv7sKnBd6WPkFLy4IMPkp2dTXZ2NocOHeLGG28kOTmZ7du3k56ezoMPPsjvfve7Th9T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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = gsearch2_2.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_2.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_2.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_2.cv_results_[ 'std_train_score' ]\n",
    " \n",
    " \n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(min_child_weight), len(max_depth))\n",
    "train_scores = np.array(train_means).reshape(len(min_child_weight), len(max_depth))\n",
    " \n",
    "for i, value in enumerate(min_child_weight):\n",
    "    pyplot.plot(max_depth, -test_scores[i], label= 'test_min_child_weight:'   + str(value))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( '- Log Loss' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据调参结果可知，这个模型参数过拟合，我们可以适当的调整一下参数，降低一下学习率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 711,
   "metadata": {},
   "outputs": [],
   "source": [
    "max_depth = range(4,10,2)\n",
    "min_child_weight = range(2,8,2)\n",
    "param_test2_2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "\n",
    "xgb2_2 = XGBClassifier(\n",
    "        learning_rate =0.02,\n",
    "        n_estimators=68, \n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 712,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n",
       "       colsample_bytree=0.8, gamma=0, learning_rate=0.02, max_delta_step=0,\n",
       "       max_depth=5, min_child_weight=1, missing=None, n_estimators=68,\n",
       "       n_jobs=1, nthread=None, num_class=2, objective='multi:softprob',\n",
       "       random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1,\n",
       "       seed=3, silent=True, subsample=0.3),\n",
       "       fit_params=None, iid=True, n_jobs=-1,\n",
       "       param_grid={'max_depth': range(4, 10, 2), 'min_child_weight': range(2, 8, 2)},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 712,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_2.set_params(num_class = 2)\n",
    "gsearch2_2 = GridSearchCV(xgb2_2, param_grid = param_test2_2, scoring='neg_log_loss',n_jobs=-1, cv=5)\n",
    "gsearch2_2.fit(x_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 713,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.168516 using {'max_depth': 6, 'min_child_weight': 4}\n"
     ]
    }
   ],
   "source": [
    "print(\"Best: %f using %s\" % (gsearch2_2.best_score_, gsearch2_2.best_params_))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 714,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/peng/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/peng/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'- Log Loss')"
      ]
     },
     "execution_count": 714,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = gsearch2_2.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_2.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_2.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_2.cv_results_[ 'std_train_score' ]\n",
    " \n",
    " \n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(min_child_weight), len(max_depth))\n",
    "train_scores = np.array(train_means).reshape(len(min_child_weight), len(max_depth))\n",
    " \n",
    "for i, value in enumerate(min_child_weight):\n",
    "    pyplot.plot(max_depth, -test_scores[i], label= 'test_min_child_weight:'   + str(value))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( '- Log Loss' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 特征重要性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 715,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The AUC of default Desicion Tree is 0.5\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "model_tree = DecisionTreeClassifier()\n",
    "model_tree.fit(x_train, y_train)\n",
    "y_prob = model_tree.predict_proba(x_test)[:,1] # This will give you positive class prediction probabilities  \n",
    "y_pred = np.where(y_prob > 0.5, 1, 0) # This will threshold the probabilities to give class predictions.\n",
    "model_tree.score(x_test, y_pred)\n",
    "print('The AUC of default Desicion Tree is',roc_auc_score(y_test,y_pred))\n",
    " \n",
    "#查看变量的重要性排序\n",
    "df = pd.DataFrame({\"columns\":list(columns), \"importance\":list(model_tree.feature_importances_.T)})\n",
    "df.sort_values(by=['importance'],ascending=False)\n",
    " \n",
    "plt.bar(range(len(model_tree.feature_importances_)), model_tree.feature_importances_)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
